package cn.edu.hitsz.compiler.asm;

import java.util.HashMap;
import java.util.Map;

// 双射
public class BMap<K, V> {
    private final Map<K, V> KVmap = new HashMap<>();
    private final Map<V, K> VKmap = new HashMap<>();

    // 添加键值对的方法
    public void put(K key, V value) {
        // 如果键或值已经存在，先删除旧的映射，确保双射关系唯一
        removeByKey(key);
        removeByValue(value);

        KVmap.put(key, value);
        VKmap.put(value, key);
    }

    public void removeByKey(K key) {
        VKmap.remove(KVmap.remove(key));
    }

    public void removeByValue(V value) {
        KVmap.remove(VKmap.remove(value));
    }

    public boolean containsKey(K key) {
        return KVmap.containsKey(key);
    }

    public boolean containsValue(V value) {
        return VKmap.containsKey(value);
    }

    public void replace(K key, V value) {
        // 删除已有的映射再添加新的，以保证双射关系的唯一性
        put(key, value);
    }

    public V getByKey(K key) {
        return KVmap.get(key);
    }

    public K getByValue(V value) {
        return VKmap.get(value);
    }

    // 清除所有内容
    public void clear() {
        KVmap.clear();
        VKmap.clear();
    }
}
